package com.atguigu.memoryleak;

import java.util.HashSet;

/**
 * 演示内存泄漏
 * @author shkstart
 * @create 14:43
 */
public class ChangeHashCode {
	public static void main(String[] args) {
		HashSet set = new HashSet();
		Person p1 = new Person(1001, "AA");
		Person p2 = new Person(1002, "BB");
		
		set.add(p1);
		set.add(p2);
		
		p1.name = "CC";//导致了内存的泄漏
		set.remove(p1); //删除失败
		
		System.out.println(set);
		
		set.add(new Person(1001, "CC"));
		System.out.println(set);
		
		set.add(new Person(1001, "AA"));
		System.out.println(set);
		
	}
}

class Person {
	int id;
	String name;
	
	public Person(int id, String name) {
		this.id = id;
		this.name = name;
	}
	
	@Override
	public boolean equals(Object o) {
		if (this == o) {
			return true;
		}
		if (!(o instanceof Person)) {
			return false;
		}
		
		Person person = (Person) o;
		
		if (id != person.id) {
			return false;
		}
		return name != null ? name.equals(person.name) : person.name == null;
	}
	
	@Override
	public int hashCode() {
		int result = id;
		result = 31 * result + (name != null ? name.hashCode() : 0);
		return result;
	}
	
	@Override
	public String toString() {
		return "Person{" + "id=" + id + ", name='" + name + '\'' + '}';
	}
}